﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CI.Caja.BE;
using System.Data.SqlClient;

namespace CI.Caja.DL
{
   public class DA_NotaDebito: IDA_NotaDebito

    {
       private DA_CierreCaja cierreDAO=new DA_CierreCaja();

       public BE.BE_Nota_Debito RegistrarNotaDebito(BE.BE_Nota_Debito notadebito)
        {
            string sentencia = "INSERT INTO CA_NOTA_DEBITO (IDNOTADEBITO,IDCIERRECAJA,IDTIPODIFERENCIA,NUMMONTO,TXTOBSERVACION) " +
                                " VALUES " +
                                " (@IDNOTADEBITO,@IDCIERRECAJA,@IDTIPODIFERENCIA,@NUMMONTO,@TXTOBSERVACION)";
            //SqlTransaction transaccion;
            using (SqlConnection conexion = new SqlConnection(DA_Utilitario.ObtenerConexion()))
            {
                conexion.Open();
                //transaccion = conexion.BeginTransaction();

                try
                {
                    using (SqlCommand comando = new SqlCommand(sentencia, conexion))
                    {
                        comando.Parameters.Add(new SqlParameter("@IDNOTADEBITO", notadebito.IdNotaDebito));
                        comando.Parameters.Add(new SqlParameter("@IDCIERRECAJA", notadebito.IdCierreCaja));
                        comando.Parameters.Add(new SqlParameter("@IDTIPODIFERENCIA", notadebito.IdTipoDiferencia));
                        comando.Parameters.Add(new SqlParameter("@NUMMONTO", notadebito.NumMonto));
                        comando.Parameters.Add(new SqlParameter("@TXTOBSERVACION", notadebito.TxtObservacion));
                        comando.ExecuteNonQuery();
                    }
                }
                catch (SqlException error)
                {
                    throw new Exception(error.Message);
                }
                finally
                {
                    if (conexion != null)
                    {
                        if (conexion.State == System.Data.ConnectionState.Open) conexion.Close();
                    }
                }

            }
            return ObtenerNotaDebito(notadebito.IdNotaDebito);
            
        }

       public BE.BE_Nota_Debito ActualizarNotaDebito(BE.BE_Nota_Debito notadebito)
        {
            throw new NotImplementedException();
        }

        public BE.BE_Nota_Debito ObtenerNotaDebito(int idNotaDebito)
        {
            BE_Nota_Debito notadebito = null;

            //string sentencia = "select idNotaDebito,idCierreCaja,idTipoDiferencia,numMonto,txtObservacion " +
            //                    " from CA_NOTA_DEBITO WHERE idNotaDebito=@idNotaDebito";

            string sentencia = " select nd.idNotaDebito,nd.idCierreCaja,nd.idTipoDiferencia,nd.numMonto,nd.txtObservacion, " +
                                " ci.feFechaCierre,pv.txtDescripcion ptoVta, " +
                                " pe.txtNombre + ' '  + pe.txtApellido personalApertura, " +
                                " pe1.txtNombre + ' '  + pe1.txtApellido personalCierre, " +
                                " case when nd.idTipoDiferencia=1 then 'Sobrante' else 'Faltante' end txtTipoDiferencia " + 
                                " from CA_NOTA_DEBITO nd " +
                                " inner join CA_CIERRE ci on nd.idcierrecaja=ci.idcierrecaja " +
                                " inner join CA_PUNTOVENTA pv on pv.idPuntoVenta=ci.idPuntoVenta " +
                                " left join CA_PERSONAL pe on pe.idPersonal=ci.idPersonalApertura " +
                                " left join CA_PERSONAL pe1 on pe1.idPersonal=ci.idPersonalCierre " +
                                " where nd.idNotaDebito=@idNotaDebito ";

            using (SqlConnection conexion = new SqlConnection(DA_Utilitario.ObtenerConexion()))
            {
                conexion.Open();
                using (SqlCommand comando = new SqlCommand(sentencia, conexion))
                {
                    comando.Parameters.Add(new SqlParameter("@idNotaDebito", idNotaDebito));

                    SqlDataReader resultado = comando.ExecuteReader();
                    if (resultado.Read())
                    {

                        notadebito = new BE_Nota_Debito();
                        notadebito.IdNotaDebito = (int)resultado["idNotaDebito"];
                        notadebito.IdCierreCaja = (int)resultado["idCierreCaja"];
                        notadebito.IdTipoDiferencia = (int)resultado["idTipoDiferencia"];
                        notadebito.NumMonto = (decimal)resultado["numMonto"];
                        notadebito.TxtObservacion=(string)resultado["txtObservacion"];
                        notadebito.Cierrecaja = cierreDAO.ObtenerCierre(notadebito.IdCierreCaja);
                        notadebito.PersonalApertura.Nombre = (string)resultado["personalApertura"];
                        notadebito.PuntoVenta.Descripcion = (string)resultado["ptoVta"];
                        notadebito.TxtTipoDiferencia = (string)resultado["txtTipoDiferencia"];

                    }   
                }
            }
            return notadebito;
        }

        public ICollection<BE.BE_Nota_Debito> ListarNotaDebito()
        {
            ICollection<BE.BE_Nota_Debito> notadebitoExistente = new List<BE.BE_Nota_Debito>();
            BE_Nota_Debito notadebito = null;

            //string sentencia = "SELECT idNotaDebito,idCierreCaja,idTipoDiferencia,numMonto,txtObservacion FROM CA_NOTA_DEBITO";
            string sentencia = " select nd.idNotaDebito,nd.idCierreCaja,nd.idTipoDiferencia,nd.numMonto,nd.txtObservacion, " +
                                " ci.feFechaCierre,pv.txtDescripcion ptoVta, " +
                                " pe.txtNombre + ' '  + pe.txtApellido personalApertura, " +
                                " pe1.txtNombre + ' '  + pe1.txtApellido personalCierre, " +
                                " case when nd.idTipoDiferencia=1 then 'Sobrante' else 'Faltante' end txtTipoDiferencia " +
                                " from CA_NOTA_DEBITO nd " +
                                " inner join CA_CIERRE ci on nd.idcierrecaja=ci.idcierrecaja " +
                                " inner join CA_PUNTOVENTA pv on pv.idPuntoVenta=ci.idPuntoVenta " +
                                " left join CA_PERSONAL pe on pe.idPersonal=ci.idPersonalApertura " +
                                " left join CA_PERSONAL pe1 on pe1.idPersonal=ci.idPersonalCierre " +
                                "  ";
            using (SqlConnection conexion = new SqlConnection(DA_Utilitario.ObtenerConexion()))
            {
                conexion.Open();
                using (SqlCommand comando = new SqlCommand(sentencia, conexion))
                {
                    SqlDataReader resultado = comando.ExecuteReader();
                    while (resultado.Read())
                    {
                        notadebito = new BE_Nota_Debito();
                        //notadebito.IdNotaDebito = (int)resultado["idNotaDebito"];
                        //notadebito.IdCierreCaja = (int)resultado["idCierreCaja"];
                        //notadebito.IdTipoDiferencia = (int)resultado["idTipoDiferencia"];
                        //notadebito.NumMonto = (decimal)resultado["NumMonto"];
                        //notadebito.TxtObservacion = (string)resultado["txtObservacion"];
                        //notadebito.Cierrecaja = cierreDAO.ObtenerCierre(notadebito.IdCierreCaja);
                        //notadebitoExistente.Add(notadebito);
                        notadebito.IdNotaDebito = (int)resultado["idNotaDebito"];
                        notadebito.IdCierreCaja = (int)resultado["idCierreCaja"];
                        notadebito.IdTipoDiferencia = (int)resultado["idTipoDiferencia"];
                        notadebito.NumMonto = (decimal)resultado["numMonto"];
                        notadebito.TxtObservacion = (string)resultado["txtObservacion"];
                        notadebito.Cierrecaja = cierreDAO.ObtenerCierre(notadebito.IdCierreCaja);
                        notadebito.PersonalApertura.Nombre = (string)resultado["personalApertura"];
                        notadebito.PuntoVenta.Descripcion = (string)resultado["ptoVta"];
                        notadebito.TxtTipoDiferencia = (string)resultado["txtTipoDiferencia"];

                        notadebitoExistente.Add(notadebito);
                    }
                }
            }
            return notadebitoExistente;
        }

        public string ObtenerCodigo()
        {
            string codigo = "";
            string sentencia = "select isnull(max(idNotaDebito),0) + 1 as Codigo from ca_nota_debito";
            using (SqlConnection conexion = new SqlConnection(DA_Utilitario.ObtenerConexion()))
            {
                conexion.Open();
                using (SqlCommand comando = new SqlCommand(sentencia, conexion))
                {
                    SqlDataReader resultado = comando.ExecuteReader();
                    if (resultado.Read())
                    {
                        codigo = resultado["Codigo"].ToString();

                    }
                }
            }
            return codigo;
        }
    }
}
